package main

import (
	"errors"
	"fmt"
	"os"
)

type Queue struct {
	maxSize int
	array   [5]int
	front   int // 指向 队列的最前面
	rear    int // 指向 队列的尾部
}

//添加数据到队列
func (q *Queue) AddData(val int) (err error) {
	//1.判读队列是否已满
	if q.rear == q.maxSize {
		return errors.New("queue full")
	}

	q.rear++
	q.array[q.rear] = val
	return nil
}

//展示数据
func (q *Queue) ShowData() {
	for i := q.front + 1; i < q.rear; i++ {
		fmt.Printf("array[%d]=%d\t", i, q.array[i])
	}
}

// 从队列中获取数据
func (q *Queue) GetData() (val int, err error) {
	if q.front == q.rear {
		return -1, errors.New("queue empty")
	}
	q.front++
	val = q.array[q.front]
	return val, nil
}

func main() {
	queue := &Queue{
		maxSize: 5,
		front:   -1,
		rear:    -1,
	}

	var key string

	for {
		fmt.Println("输入add,添加数据\n")
		fmt.Println("输入get 获取数据\n")
		fmt.Println("输入show 展示数据\n")
		fmt.Println("输入exit 退出\n")

		fmt.Scanln(&key)
		switch key {
		case "add":
			fmt.Println("输入要添加的数字:")
			var val int
			fmt.Scanln(&val)
			if err := queue.AddData(val); err == nil {
				fmt.Println("添加成功")
			} else {
				fmt.Println(err)
			}
		case "get":
			val, err := queue.GetData()
			if val == -1 && err != nil {
				fmt.Printf("error")
			} else {
				fmt.Printf("取出的数%d\n", val)
			}
		case "show":
			queue.ShowData()
		case "exit":
			os.Exit(0)

		}
	}

}
